#ifndef BASIC_TYPE_H_
#define BASIC_TYPE_H_

#include <Eigen/Core>
#include <iostream>
#include <opencv2/core.hpp>

/// @brief rect struct
struct Rect {
  /// @brief x-coordinate of upper left corner (lowest memory address).
  int x;
  /// @brief y-coordinate of upper left corner (lowest memory address).
  int y;
  /// @brief  Rectangle height.
  int height;
  /// @brief Rectangle width.
  int width;
};

struct Point2f {
  /// @brief x
  float x;
  /// @brief y
  float y;
};

struct Point3f {
  /// @brief x
  float x;
  /// @brief y
  float y;
  /// @brief z
  float z;
};

// Point XYZIT
struct PointXYZIT {
  ///@brief X
  float x;
  ///@brief Y
  float y;
  ///@brief Z
  float z;
  ///@brief Intensity
  std::uint8_t intensity;
  ///@brief Time stamp
  std::int64_t timestamp;
  ///@brief Ring number
  std::uint16_t ring;
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;

// Point XYZIT
struct PointXTZDopppler {
  ///@brief X
  float x;
  ///@brief Y
  float y;
  ///@brief Z
  float z;
  ///@brief vx
  float vx;
  ///@brief vy
  float vy;
  ///@brief rcs
  float rcs;
  ///@brief Time stamp
  std::int64_t timestamp;
};

// image data
struct ImageData {
  ///@brief time stamp
  std::int64_t timestamp;
  ///@brief image
  cv::Mat image;
};

#endif  // !BASIC_TYPE_H_
